﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Infrastructure.Centers
{
    /// <summary>
    /// 数字类型处理类
    /// </summary>
    public static class NumberUtils
    {
        /// <summary>
        /// 将一个 long 类型的值转换为 Guid 类型。
        /// 该方法将 long 值的字节表示放入 Guid 的字节数组中。
        /// </summary>
        /// <param name="value">要转换的 long 值。</param>
        /// <returns>转换后的 Guid 值。</returns>
        public static Guid LongToGuid(long value)
        {
            byte[] array = new byte[16]; // 创建一个长度为 16 字节的数组
            BitConverter.GetBytes(value).CopyTo(array, 8); // 将 long 值转换为字节数组并拷贝到从索引 8 开始的数组部分

            // 如果系统是小端字节序（Little Endian），则需要反转后 8 个字节
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse((Array)array, 8, 8); // 反转字节数组中的后 8 个字节
            }

            return new Guid(array); // 使用字节数组创建 Guid 并返回
        }

        /// <summary>
        /// 将 Guid 类型的字符串转换为 long 类型的值。
        /// 该方法将 Guid 字符串解析为字节数组，然后获取从索引 8 开始的 8 个字节，最终转换为 long 值。
        /// </summary>
        /// <param name="value">Guid 字符串。</param>
        /// <returns>转换后的 long 值。</returns>
        public static long GuidToLong(string value)
        {
            byte[] array = Guid.Parse(value).ToByteArray(); // 将 Guid 字符串解析为字节数组

            // 如果系统是小端字节序（Little Endian），则需要反转后 8 个字节
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse((Array)array, 8, 8); // 反转字节数组中的后 8 个字节
            }

            return BitConverter.ToInt64(array, 8); // 从字节数组中的第 8 位开始获取 long 值并返回
        }

        /// <summary>
        /// 将 long 类型的值编码为 16 位小写十六进制字符串。
        /// </summary>
        /// <param name="value">要编码的 long 值。</param>
        /// <returns>编码后的小写十六进制字符串。</returns>
        public static string EncodeLongToLowerHexString(long value)
        {
            return value.ToString("x16"); // 将 long 值转换为 16 位的小写十六进制字符串
        }

        /// <summary>
        /// 将十六进制字符串解码为 long 类型的值。
        /// </summary>
        /// <param name="longAsHexString">要解码的十六进制字符串。</param>
        /// <returns>解码后的 long 值。</returns>
        public static long DecodeHexString(string longAsHexString)
        {
            return Convert.ToInt64(longAsHexString, 16); // 将十六进制字符串转换为 long 类型的值
        }
    }

}
